package com.example.liujie.listener

import com.badlogic.gdx.ApplicationAdapter
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Stage
import com.example.liujie.actor.MyActor
import android.content.ContentValues.TAG
import com.badlogic.gdx.Input
import com.badlogic.gdx.scenes.scene2d.InputEvent
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
import com.badlogic.gdx.scenes.scene2d.InputListener



class ListenerGame : ApplicationAdapter() {
    lateinit var texture: Texture
    lateinit var region: TextureRegion
    lateinit var stage: Stage
    lateinit var myActor: Actor

    override fun create() {
        super.create()
        texture = Texture("a.jpg")
        region = TextureRegion(texture)
        stage = Stage()
        myActor = MyActor(region)
        stage.addActor(myActor)
        Gdx.input.inputProcessor = stage
        stage.addListener(MyInputListener())
        myActor.addListener(MyClickListener())

    }

    override fun render() {
        super.render()
        // 设置清屏颜色为红色
        Gdx.gl.glClearColor(0f, 0f, 0f, 100f)
        // 清屏
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
        stage.act()
        stage.draw()

    }


    override fun dispose() {
        super.dispose()
    }
}

/**
 * 输入事件监听器（包括触屏, 鼠标点击, 键盘按键 的输入）
 */
private class MyInputListener : InputListener() {
    /**
     * 当有键盘按键被按下时调用, 参数 keycode 是被按下的按键的键值,
     * 所有键盘按键的键值常量定义在 com.badlogic.gdx.Input.Keys 类中
     */
    override fun keyDown(event: InputEvent, keycode: Int): Boolean {
        when (keycode) {
            Input.Keys.UP -> {
                Gdx.app.log(TAG, "被按下的按键: 方向上键")
            }
            Input.Keys.DOWN -> {
                Gdx.app.log(TAG, "被按下的按键: 方向下键 ")
            }
            Input.Keys.A -> {
                Gdx.app.log(TAG, "被按下的按键: A键")
            }
            Input.Keys.ENTER -> {
                Gdx.app.log(TAG, "被按下的按键: 回车键")
            }
            else -> {
                Gdx.app.log(TAG, "其他按键, KeyCode: " + keycode)
            }
        }
        return false
    }

    /**
     * 手指/鼠标 按下时调用
     *
     * @param x
     * 按下时的 X 轴坐标, 相对于被触摸对象（监听器注册者）的左下角
     *
     * @param y
     * 按下时的 Y 轴坐标, 相对于被触摸对象（监听器注册者）的左下角
     *
     * @param pointer
     * 按下手指的ID, 用于多点触控时辨别按下的是第几个手指,
     * 一般情况下第一只手指按下时 pointer 为 0, 手指未抬起前又有一只手指按下, 则后按下的手指 pointer 为 1。
     * 同一只手指的 按下（touchDown）, 拖动（touchDragged）, 抬起（touchUp）属于同一次序列动作（pointer 值相同）,
     * pointer 的值在 按下 时被确定, 之后这只手指产生的的 拖动 和 抬起 动作将会把该已确定的 pointer 值传递给其事件方法
     * touchDragged() 和 touchUp() 方法。
     *
     * @return
     * 返回值为 boolean 类型, 用于告诉上一级当前对象（演员/舞台）是否需要处理该次事件。 <br></br><br></br>
     *
     * 返回 true: 表示当前对象需要处理该次事件, 则之后这只手指产生的 拖动（touchDragged）和 抬起（touchUp）事件
     * 也会传递到当前对象。<br></br><br></br>
     *
     * 返回 false: 表示当前对象不处理该次事件, 既然不处理, 则之后这只手指产生的 拖动（touchDragged）和 抬起（touchUp）事件
     * 也将不会再传到到当前对象。<br></br><br></br>
     *
     * PS: 当前对象是否处理一只手指的触摸事件（按下, 拖动, 抬起）只在 按下时（touchDown）确定,
     * 所以之后的 touchDragged() 和 touchUp() 方法中就不再判断, 因此返回类型为 void。
     */
    override fun touchDown(event: InputEvent, x: Float, y: Float, pointer: Int, button: Int): Boolean {
        Gdx.app.log(TAG, "touchDown: $x, $y; pointer: $pointer")
        return true
    }

    /**
     * 手指/鼠标 按下后拖动时调用
     */
    override fun touchDragged(event: InputEvent, x: Float, y: Float, pointer: Int) {
        Gdx.app.log(TAG, "touchDragged: $x, $y; pointer: $pointer")
        event.relatedActor.setPosition(x,y)
    }

    /**
     * 手指/鼠标 抬起时调用
     */
    override fun touchUp(event: InputEvent, x: Float, y: Float, pointer: Int, button: Int) {
        Gdx.app.log(TAG, "touchUp: $x, $y; pointer: $pointer")
    }
}

/**
 * 点击 监听器（只包括 手指点击 或 鼠标点击）
 */
private class MyClickListener : ClickListener() {

    /**
     * 对象（演员/舞台）被点击时调用
     *
     * @param x
     * 点击时（手指抬起时）的 X 轴坐标, 相对于被点击对象（监听器注册者）的左下角
     *
     * @param y
     * 点击时（手指抬起时）的 Y 轴坐标, 相对于被点击对象（监听器注册者）的左下角
     */
    override fun clicked(event: InputEvent, x: Float, y: Float) {
        // 获取响应这个点击事件的演员
        val actor = event.getListenerActor()

        Gdx.app.log(TAG, "被点击: " + x + ", " + y + "; Actor: " + actor.javaClass.getSimpleName())
    }
}